#include "system.h"
#include "alt_types.h"
#include "altera_avalon_pio_regs.h"
#include "priv/alt_busy_sleep.h"
#include "a8255.h"
#include "io.h"
#include <stdio.h>

void _8255_IN(unsigned char port, unsigned char *data)
{
    char tmp;
    IOWR_ALTERA_AVALON_PIO_DATA(cs, 0);
    IOWR_ALTERA_AVALON_PIO_DATA(address, port);
    IOWR_ALTERA_AVALON_PIO_DATA( rd, 0);
    IOWR_ALTERA_AVALON_PIO_DATA(wr, 1);
    
    alt_busy_sleep(1000);
    
    tmp = IORD_ALTERA_AVALON_PIO_DATA(DOUT);
    *data = tmp;
    
    IOWR_ALTERA_AVALON_PIO_DATA(wr, 1);
    IOWR_ALTERA_AVALON_PIO_DATA(rd, 1);
    IOWR_ALTERA_AVALON_PIO_DATA(cs, 1);
}

void _8255_OUT(unsigned char port, unsigned char data)
{
    IOWR_ALTERA_AVALON_PIO_DATA(DIN, data);
    
    IOWR_ALTERA_AVALON_PIO_DATA(cs, 0);
    IOWR_ALTERA_AVALON_PIO_DATA(address, port);
    IOWR_ALTERA_AVALON_PIO_DATA(rd, 1);
    
    IOWR_ALTERA_AVALON_PIO_DATA(wr, 0);
    
    alt_busy_sleep(100);
    
    IOWR_ALTERA_AVALON_PIO_DATA(wr, 1);
    IOWR_ALTERA_AVALON_PIO_DATA(rd, 1);
    IOWR_ALTERA_AVALON_PIO_DATA(cs, 1);
}

unsigned char _8255_QUERY(unsigned mask)
{
    unsigned char data = 0;
    _8255_IN(PC, &data);
    return (!(data & mask));
}

void _8255_LOOP_QUERY(unsigned mask)
{
    while(!_8255_QUERY(mask))
        ;
}